package net.hnilica.cisteniulic.xml;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Inspirated by http://hg.frantovo.cz/SuperDAO/
 * @author swosh
 */
public class MyXMLLoader {

    /**
     */
    public static void main(String[] args) {
        System.out.println(new MyXMLLoader().getVlastnost(VLASTNOSTI.AHOJ));

    }

    private Logger log = Logger.getLogger(getClass().getName());
    private static Map<Object, Properties> vlastnosti = Collections.synchronizedMap(new HashMap<Object, Properties>());

    private enum VLASTNOSTI {

        AHOJ;
    }

    /**
     */
    private Properties getHodnoty(String pripona, Class trida) {
        String soubor = trida.getSimpleName() + "." + pripona;

        try {
            Properties hodnoty = new Properties();
            InputStream fis = trida.getResourceAsStream(soubor);
            hodnoty.loadFromXML(fis);
            return hodnoty;
        } catch (Exception e) {
            log.log(Level.SEVERE, "Chyba při načítání vlastností: " + soubor, e);
            return null;
        }
    }

    /**
     */
    /*
    private Properties getHodnoty(String cesta) {

        try {
            Properties hodnoty = new Properties();
            //There was a problem because. Java dontfind real absolute path for file in package
            //files must be outside classes!!!!!
            File soubor = new File(cesta).getAbsoluteFile();

            InputStream fis = new FileInputStream(soubor);
            hodnoty.loadFromXML(fis);
            return hodnoty;
        } catch (Exception e) {
            log.log(Level.SEVERE, "Chyba při načítání vlastností: " + cesta, e);
            return null;
        }
    }
*/
    private String getHodnota(Map<Object, Properties> mezipamet, String pripona, Enum klic, Class trida) {

        if (trida == null) {
            trida = getClass();
        }

        if (mezipamet.get(trida) == null) {
            /** Ještě nemáme načteno ze souboru */
            mezipamet.put(trida, getHodnoty(pripona, trida));

            if (mezipamet.get(trida) == null) {
                /** Došlo k chybě --> už to příště nebudeme zkoušet načítat */
                mezipamet.put(trida, new Properties());
            }
        }

        return mezipamet.get(trida).getProperty(klic.toString());
    }
/*
    private String getHodnota(Map<Object, Properties> mezipamet, Enum klic, String cesta) {

        if (mezipamet.size() == 0) {

            mezipamet.put(cesta, getHodnoty(cesta));

            if (mezipamet.get(cesta) == null) {

                mezipamet.put(cesta, new Properties());
            }
        }

        return mezipamet.get(cesta).getProperty(klic.toString());
    }
*/
    public String getVlastnost(Enum klic, Class trida) {
        return getHodnota(vlastnosti, "xml", klic, trida);
    }
    public  String getVlastnost(Enum klic) {
	return getVlastnost(klic, null);
    }
/*
    public String getVlastnost(Enum klic, String cesta) {

        return getHodnota(vlastnosti, klic, cesta);
    }
*/
}
